package Gestores.DtoObjects;

import Gestores.DaoInterfaces.AfiliadoDAO;
import Gestores.DataBaseLink;
import Gestores.Entidades.EntidadAfiliado;
import Gestores.NucleoBaseDatos;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class AfiliadoDTO implements AfiliadoDAO {

    private DataBaseLink gestor;

    public AfiliadoDTO() {
        gestor = NucleoBaseDatos.getInstance();
    }

    @Override
    public ArrayList<Object> buscarPorId(String id) throws Exception {
        ResultSet resultado = gestor.executeSql("Call BuscarAfiliadoPorId('" + id + "');");
        return devolverListaCargada(resultado);
    }

    @Override
    public ArrayList<Object> buscarPorCi(int ci) throws Exception {
        ResultSet resultado = gestor.executeSql("Call BuscarAfiliadoPorCi(" + ci + ");");
        return devolverListaCargada(resultado);
    }

    @Override
    public ArrayList<Object> buscarPorNombres(String nombre) throws Exception {
        ResultSet resultado = gestor.executeSql("Call BuscarAfiliadoPorNombres('" + nombre + "');");
        return devolverListaCargada(resultado);
    }

    @Override
    public ArrayList<Object> buscarPorApellidoPaterno(String apellidoPaterno) throws Exception {
        ResultSet resultado = gestor.executeSql("Call BuscarAfiliadoPorApellidoPaterno('" + apellidoPaterno + "');");
        return devolverListaCargada(resultado);
    }

    @Override
    public ArrayList<Object> buscarPorApellidoMaterno(String apellidoMaterno) throws Exception {
        ResultSet resultado = gestor.executeSql("Call BuscarAfiliadoPorApellidoMaterno('" + apellidoMaterno + "');");
        return devolverListaCargada(resultado);
    }

    @Override
    public ArrayList<Object> buscarPorEstadoCivil(char estadoCivil) throws Exception {
        ResultSet resultado = gestor.executeSql("Call BuscarAfiliadoPorEstadoCivil('" + estadoCivil + "')");
        return devolverListaCargada(resultado);
    }

    @Override
    public ArrayList<Object> buscarPorFechaInscripcion(Date fechaInscripcion) throws Exception {
        ResultSet resultado = gestor.executeSql("Call BuscarAfiliadoPorFechaInscripcion('" + fechaInscripcion.toString() + "');");
        return devolverListaCargada(resultado);
    }

    @Override
    public ArrayList<Object> buscarPorActivos() throws Exception {
        ResultSet resultado = gestor.executeSql("Call BuscarAfiliadoPorActivos();");
        return devolverListaCargada(resultado);
    }

    @Override
    public ArrayList<Object> buscarPorNoActivos() throws Exception {
        ResultSet resultado = gestor.executeSql("Call BuscarAfiliadoPorNoActivos();");
        return devolverListaCargada(resultado);
    }

    public void habilitarAfiliado(String id) throws Exception {
        gestor.executeSql("Call HabilitarAfiliado('" + id + "');");
    }

    public void deshabilitarAfiliado(String id) throws Exception {
        gestor.executeSql("Call DeshabilitarAfiliado('" + id + "');");
    }

    @Override
    public void insertar(Object objeto) throws Exception {
        EntidadAfiliado eAfiliado = (EntidadAfiliado) objeto;
        gestor.executeSql("Call InsertarAfiliado(" + eAfiliado.cadenaParaInsercion() + ");");
    }

    @Override
    public void actualizar(Object primaryKey, Object objeto) throws Exception {
        String llavePrimaria = (String) primaryKey;
        EntidadAfiliado eAfiliado = (EntidadAfiliado) objeto;

        ResultSet resultado = gestor.executeSql(
                "Call ActualizarAfiliado('" + llavePrimaria
                + "'," + eAfiliado.cadenaParaActualizacion() + ");");
    }

    @Override
    public void eliminacionLogica(Object objeto) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void eliminacionFisica(Object objeto) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public ArrayList<Object> listarTabla() throws Exception {
        ResultSet resultado = gestor.executeSql("Call ListarAfiliados();");
        return devolverListaCargada(resultado);
    }

    public ArrayList<Object> listarCodigosPorInicial(String apellido) throws Exception {
        ResultSet resultado = gestor.executeSql("Call ListarCodigosPorInicial('" + apellido + "');");
        return devolverListaCargada(resultado);
    }

    private ArrayList<Object> devolverListaCargada(ResultSet resultado) throws SQLException {
        ArrayList<Object> lista = new ArrayList<Object>();
        while (resultado.next()) {
            EntidadAfiliado eAfiliado = new EntidadAfiliado(resultado.getString(1),
                    resultado.getInt(2),
                    resultado.getString(3),
                    resultado.getString(4),
                    resultado.getString(5),
                    resultado.getString(6),
                    resultado.getString(7),
                    resultado.getDate(8),
                    resultado.getBoolean(9));
            lista.add(eAfiliado);
        }
        return lista;
    }

    @Override
    public boolean existe(String id) throws Exception {
        ResultSet resultado = gestor.executeSql("Select ExisteAfiliado('" + id + "');");
        resultado.next();
        return resultado.getBoolean(1);
    }
}
